package main

import "fmt"

/*
万年历：
判断一个年份是否闰年()
求每个月的天数()
求总天数()
 */

 //调用这个函数就直接能求出是否是闰年,是闰年就返回true,不是就false
 //求的时候需要传参数年份进去
func leapYear(year int) bool {
	if year%4 == 0 && year%100 != 0 || year%400 == 0 {
		return true
	}
	return false
}

//接着求每个月的天数，用switch最好实现
//传参年和月就可以根据是否闰年来计算每个月的天气
func getDayOfMonth(year,month int) int  {
	switch month {
	case 1,3,5,7,8,10,12:
		return 31
	case 4,6,9,11:
		return 30
	case 2:
		if leapYear(year){ //直接用求闰年函数，很方便
			return 29
		}else{
			return 28
		}
	}
	return 0 //既然函数需要有返回值，这个地方必须加
}

//用于求1900年1月1日到给定月的上一个月的总天数
//1900.1.1-2018.3.31
func getDays(year,month int)int  {
	//year 2000,month 4
	sum:=0
	//1.1900年到给定年份的上一年底的总天数
	for i:=1900;i<year;i++{//遍历1900年到给定年份上一年底的天数
	//根据是否是闰年来区分天气，把得到的每年的天数都累加得到num
		if leapYear(i){
			sum+=366
		}else {
			sum+=365
		}
	}
	//2.当年的１月到给定月份上一个月的总天数
	day:=0
	for i:=1;i<month;i++{
		//调用getDayOfMonth函数来判断当年的月份
		//计算当年１月到给定月份上一个月天总天气
		day=getDayOfMonth(year,i)
		sum+=day
	}
	return sum
	/*上面是分开算．先不用给定年份的天数，因为年还没过完．比如给定年2018
	但是２０１８年只过了４个月，所以先算1999年到2017年的总天气．
	然后剩下的2018年的1-4月天气就再算一次．
	算完后再加到上面１９００年－２０１７年算的总天数中．
	算完后一起返回1999年-2018年3月31号的总天数
	*/
}

//打印万年历函数
func printCalender(year,month int)  {
	//1.先计算空格数量
	days:=getDays(year,month) //计算一下1900年到上个月末总天数
	kong:=(days+1)%7
	//计算空格是如果星期一在最前面就是总天数%7，如果是星期日在最前，就总天数+1
	//如果星期六在最前就总天数+2
	fmt.Println(kong)
	//2.计算该月的天数
	day:=getDayOfMonth(year,month)
	fmt.Println(day)
	//3.打印
	//先打印万年历最上面一行星期
	fmt.Println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六")
	//接着打下面的日期和空格
	//打出空格
	for i:=0;i<kong;i++{
		fmt.Print("\t\t")
	}
	//打出日期数字
	for i:=1;i<=day;i++{
		fmt.Print(i,"\t\t")
		if (kong+i)%7==0{
			fmt.Println()
		}
	}

}
func main() {
	year:=2018
	month:=4
	printCalender(year,month)
}
